<?php
/**
 * file.libaray.php
 * @Copyright lemonCarlJ All rights reserved.
 * @License http://www.56code.com/License.txt
 * @Version 1.0.0
 * @Email rpgshifa@aliyun.com
 */
namespace SF\libaray;

class file
{
    /**
     * 新建文件
     * @param string $file_path 文件路径
     * @param string $mode 创建模式 [ x ]
     * @return boolean 返回创建失败或者新文件文件资源句柄
     */
    static public function create( $file_path, $mode = 'x' )
    {
        return fopen( $file_path, $mode );
    }
    
    /**
     * 读取文件
     * @param string $file_path 文件路径
     * @param string|int 读取文件内容大小 [ 0 ]
     * @return string|false 返回读取内容或者读取失败
     */
    static public function read( $file_path, $read_size = 0 )
    {
        $handle = self::create( $file_path, 'r' );
        
        if( $handle )
        {
            if( $read_size !== 0 )
            {
                $read_size = self::size_convert( $read_size, 'B' );
            }else{
                $read_size = filesize( $file_path );
            }
            
            if( $read_size < 1 )
            {
                $read_size = 1;
            }
            
            if( flock( $handle, LOCK_SH ) )
            {
                $content = fread( $handle, $read_size );
                flock( $handle, LOCK_UN );
                fclose( $handle );
            }
            
            return $content;
        }
        
        return false;
    }
    
    /**
     * 写入文件
     * @param string $file_path 文件路径
     * @param string $content 写入内容
     * @param boolean $cover 是否覆盖内容
     * @return boolean 返回写入状态
     */
    static public function write( $file_path, $content, $cover = true )
    {
        //是否写入
        $is_write = false;
        
        if( file_exists( $file_path ) )
        {
            $handle = self::create( $file_path, $cover ? 'wb' : 'a' );
            if( $handle )
            {
                if( flock( $handle, LOCK_EX ) )
                {
                    if( fwrite( $handle, $content ) )
                    {
                        $is_write = true;
                    }
                    flock( $handle, LOCK_UN );
                    fclose( $handle );
                }
            }
        }
        
        return $is_write;
    }
    
    /**
     * 删除文件
     * @param string $file_path 文件路径
     * @return boolean 返回是否删除成功
     */
    static public function delete( $file_path )
    {
        return unlink( $file_path );
    }
    
    /**
     * 文件重命名
     * @param string $file_path 文件路径
     * @param string $new_name 新文件名
     * @return boolean 返回是否重命名成功
     */
    static public function rename( $file_path, $new_name )
    {
        $new_directory = dirname( $file_path ) . DIRECTORY_SEPARATOR . $new_name . self::file_extension( $file_path );
        return self::move( $file_path, $new_directory );
    }
    
    /**
     * 移动文件
     * @param string $file_path 文件路径
     * @param string $move_directory 移动到的目标目录
     * @return boolean 返回是否移动成功
     */
    static public function move( $file_path, $move_directory )
    {
        $new_file_path = realpath( $move_directory ) . DIRECTORY_SEPARATOR . basename( $file_path );
        if( !file_exists( $new_file_path ) )
        {
            return rename( $file_path, $new_file_path );
        }
        return false;
    }
    
    /**
     * 复制文件
     * @param string $file_path 文件路径
     * @param string $copy_directory 复制到的目标目录
     * @return boolean 返回是否复制成功
     */
    static public function copy( $file_path, $copy_directory )
    {
        $new_file_path = realpath( $copy_directory ) . DIRECTORY_SEPARATOR . basename( $file_path );
        if( !file_exists( $new_file_path ) )
        {
            //读取源文件内容
            $content = self::read( $file_path );
            
            //写入内容
            return self::write( $new_file_path, $content );
        }
        
        return false;
    }
    
    /**
     * 获取文件字节大小
     * @param string $file_path 文件路径
     * @param string $byte 文件字节单位 [ B ]
     * @param number $reserve 保留返回大小的小数位
     * @return number|boolean 返回大小或者是否获取成功
     */
    static public function file_size( $file_path, $byte = 'B', $reserve = 0 )
    {
        return self::size_convert( filesize( $file_path ), $byte, $reserve );
    }
    
    /**
     * 转换字节类型
     * @param string|int $filesize 文件大小
     * @param string $convert 转换类型
     * @param number $reserve 保留返回大小的小数位
     * @return number 转换后对应字节的文件大小
     */
    static public function size_convert( $filesize, $convert = 'B', $reserve = 0  )
    {
        //获取字节单位
        $byte = 'B';
        if( is_string( $filesize ) )
        {
            $byte = substr( $filesize, -1 );
            $filesize = intval( substr( $filesize, 0, -1) );
        }
        
        $byte_list = 'BKMGTP';
        
        //字节类型分析
        $byte_pos = strpos( $byte_list, $byte );
        $convert_pos = strpos( $byte_list, $convert );
        
        //相同字节类型
        if( $byte_pos === $convert_pos )
        {
            return $filesize;
        }
        
        //差异字节类型
        $differ = $byte_pos - $convert_pos;
        $count = abs( $differ );
        for ( $i = 0 ; $i < $count ; $i ++ )
        {
            if( $differ > 0 )
            {
                $filesize *= 1024;
            }else{
                $filesize /= 1024;
            }
        }
        
        if( $reserve )
        {
            $filesize = round( $filesize, $reserve );
        }
        
        return $filesize;
    }
    
    /**
     * 获取文件名
     * @param string $file_path 文件路径
     * @return string 返回文件名
     */
    static public function name( $file_path )
    {
        $path_info = pathinfo( $file_path );
        return $path_info[ 'filename' ];
    }
    
    /**
     * 获取文件后缀
     * @param string $file_path 文件路径
     * @return string 返回文件后缀或者空
     */
    static public function extension( $file_path )
    {
        $path_info = pathinfo( $file_path );
        return isset( $path_info[ 'extension' ] ) ? $path_info[ 'extension' ] : '';
    }
    
    /**
     * 返回文件最后访问时间
     * @param string $file_path 文件路径
     * @return number 返回访问时间戳
     */
    static public function access_time( $file_path )
    {
        return fileatime( $file_path );
    }
    
    /**
     * 返回文件最后修改时间
     * @param string $file_path 文件路径
     * @return number 返回修改时间戳
     */
    static public function modify_time( $file_path )
    {
        return filemtime( $file_path );
    }
    
    /**
     * 返回文件最后变化时间
     * @param string $file_path 文件路径
     * @return number 返回变化时间戳
     */
    static public function change_time( $file_path )
    {
        return filectime( $file_path );
    }
}